describe('bilibili User Simulation', () => {  
  // 首页登录工作流测试
  it('Login Test', () => {
    // 根据网址打开首页
    cy.visit('https://www.bilibili.com');

    // 滚动页面让所有推荐内容都被加载
    cy.scrollTo('bottom');
    cy.wait(2000);

    // 回到顶部，测试登录按钮是否加载正常
    cy.scrollTo('top');
    cy.get('.header-login-entry').should('exist')
    .find('span').contains('登录')
    .click();

    // 测试登录功能
    // 获取账号输入框并输入账号
    cy.get('.tab__form > :nth-child(1) > input').should('exist')
    .should('be.visible').type('123456789');

    // 获取密码输入框并输入密码
    cy.get(':nth-child(3) > input').should('exist')
    .should('be.visible').type('123456789');

    // 检查登录按钮是否正常显示并点击
    cy.get('.btn_primary').should('exist').should('be.visible').click();

    // 手动等待1秒以提供测试逻辑之间的间隔(实际批量测试中可以不需要)
    cy.wait(1000);
    // 测试人机验证图片的刷新
    cy.get('.geetest_refresh').should('exist').click();
    cy.wait(1000);
    cy.get('.geetest_refresh').should('exist').click();
    // 刷新后需要设置阈值来确保图片加载稳定后再断言其可见性
    cy.get('.geetest_item_img', { timeout: 10000 })
      .should('exist')
      .should('be.visible');
    cy.wait(500);

    // 点击人机验证图片
    cy.get('.geetest_item_img').click();
    // 点击确认提交人机验证结果(显然结果是不正确的，所以后续断言是否有不通过提示)
    cy.get('.geetest_commit_tip').should('exist').should('be.visible').click();

    // 断言“验证失败”提示是否存在并且可见
    cy.get('.geetest_result_tip', { timeout: 10000 })
      .should('exist') // Ensure the element exists
      .should('be.visible') // Ensure it is visible
      .should('contain', '验证失败 请按提示重新操作'); // Assert the content
      cy.wait(500);

      // 点击关闭人机验证窗口
      cy.get('.geetest_close').should('exist').should('be.visible').click();
      cy.wait(500);

      // 点击关闭登录窗口
      cy.get('.bili-mini-close-icon').should('exist').should('be.visible').click();
  })

  // 搜索工作流测试
  it('Video Search Test', () => {
    cy.visit('https://www.bilibili.com', {
      onBeforeLoad(win) {
        // 将window.open方法存根为searchWindowOpen方法
        cy.stub(win, 'open').as('searchWindowOpen');
      }
    });

    // 检查搜素框的存在和可见性并点击
    cy.get('#nav-searchform').should('exist')
      .find('.nav-search-content').should('exist')
      .find('.nav-search-input').should('exist').should('be.visible');
    cy.get('.nav-search-input').click()

    // 输入内容并测试清空功能
    cy.get('.nav-search-input').type('Cypress框架');
    cy.get('.nav-search-clean').should('exist').should('be.visible').click()

    // 检查搜索按钮的存在和可见性
    cy.get('.nav-search-btn').should('exist').should('be.visible');
    
    
    // 输入内容并点击搜索
    cy.get('.nav-search-input').type('Python入门');
    cy.wait(500);
    cy.get('.nav-search-btn').click()
    
    // 点击搜索后需要捕获并拦截window.open方法的调用并提取新窗口跳转的URL
    cy.get('@searchWindowOpen').should('be.called').then((stub: any) => {
      const URL = stub.getCall(0).args[0]; //第一个参数就是跳转的URL
      cy.log(`Captured URL for search: ${URL}`);
      if (URL) {
        const absoluteUrl = `https:${URL}`; // 补全URL
        cy.log(`Visiting search results page: ${absoluteUrl}`);
        cy.visit(absoluteUrl); // 在当前窗口在cypress框架下访问搜索结果页面的URL
      } else {
        throw new Error(`Could not extract a valid URL from: ${URL}`);
      }
    });

    // 点击测试基本的筛选条件
    cy.get('.conditions-order > .search-condition-row > :nth-child(2)')
    .should('exist')
    .should('be.visible').contains('最多播放')
    .click();
    cy.wait(2000) // 等待筛选结果加载
    cy.get('.conditions-order > .search-condition-row > :nth-child(3)')
    .should('exist')
    .should('be.visible').contains('最新发布')
    .click();
    cy.wait(2000) // 等待筛选结果加载
    cy.get('.conditions-order > .search-condition-row > :nth-child(4)')
    .should('exist')
    .should('be.visible').contains('最多弹幕')
    .click();
    cy.wait(2000) // 等待筛选结果加载
    cy.get('.conditions-order > .search-condition-row > :nth-child(5)')
    .should('exist')
    .should('be.visible').contains('最多收藏')
    .click();
    cy.wait(2000) // 等待筛选结果加载
    cy.get('.conditions-order > .search-condition-row > :nth-child(1)')
    .should('exist')
    .should('be.visible').contains('综合排序')
    .click();
    cy.wait(2000) // 等待筛选结果加载

    cy.get('.conditions-order > .vui_button--active-shrink').should('exist')
    .should('be.visible').contains('更多筛选')
    .click()
    cy.wait(2000) // 等待筛选结果加载

    // 日期筛选条件数组
    const dateConditions = [
      { selector: '.more-conditions > :nth-child(1) > :nth-child(2)', text: '最近一天' },
      { selector: '.more-conditions > :nth-child(1) > :nth-child(3)', text: '最近一周' },
      { selector: '.more-conditions > :nth-child(1) > :nth-child(4)', text: '最近半年' },
      { selector: '.more-conditions > :nth-child(1) > :nth-child(1)', text: '全部日期' }
    ];

    // 时间长度筛选条件数组
    const timeConditions = [
      { selector: '.more-conditions > :nth-child(2) > :nth-child(2)', text: '10分钟以下' },
      { selector: '.more-conditions > :nth-child(2) > :nth-child(3)', text: '10-30分钟' },
      { selector: '.more-conditions > :nth-child(2) > :nth-child(4)', text: '30-60分钟' },
      { selector: '.more-conditions > :nth-child(2) > :nth-child(5)', text: '60分钟以上' },
      { selector: '.more-conditions > :nth-child(2) > :nth-child(1)', text: '全部时长' }
    ];

    // 外层遍历视频时长日期的筛选条件
    dateConditions.forEach(date => {
      cy.get(date.selector)
        .should('exist')
        .should('be.visible')
        .contains(date.text)
        .click();
      cy.wait(2000);

      // 内层遍历视频时长筛选条件
      timeConditions.forEach(time => {
        cy.get(time.selector)
          .should('exist')
          .should('be.visible')
          .contains(time.text)
          .click();
        cy.wait(2000);
      });
    });


  })

  // 视频播放工作流测试
  it.only('Video Watch Test', () => {
    // 访问首页
    cy.visit('https://www.bilibili.com', {
      onBeforeLoad(win) {
        cy.stub(win, 'open').as('searchWindowOpen');
      }
    });

    // 输入内容并点击搜索
    cy.get('.nav-search-input').type('Python入门');
    cy.wait(500);
    cy.get('.nav-search-btn').click()
    cy.wait(1000);
    
    // 点击搜索后需要捕获并拦截window.open方法的调用并提取新窗口跳转的URL
    cy.get('@searchWindowOpen').should('be.called').then((stub: any) => {
      const URL = stub.getCall(0).args[0]; //第一个参数就是跳转的URL
      cy.log(`Captured URL for search: ${URL}`);
      if (URL) {
        const absoluteUrl = `https:${URL}`; // 补全URL
        cy.log(`Visiting search results page: ${absoluteUrl}`);
        cy.visit(absoluteUrl); // 在当前窗口在cypress框架下访问搜索结果页面的URL
      } else {
        throw new Error(`Could not extract a valid URL from: ${URL}`);
      }
    });

      // 提取第一个视频标签中的链接
    cy.get('.bili-video-card__wrap a')
      .first()
      .invoke('attr', 'href') 
      .then((href) => {
        // 确保链接被正确地格式化
        if (href) {
          const videoUrl = href.startsWith('//') ? `https:${href}` : href; 
          cy.log(`Navigating to video URL: ${videoUrl}`); 
          cy.visit(videoUrl); 
        } else {
          throw new Error('Could not extract video URL.');
        }
      });

    // 手动等待加载完全
    cy.wait(3000); 
    cy.log('Successfully navigated to the video page!');
    
    cy.get('video')
      .trigger('mouseover')
      .wait(5000);
    // 进入网页全屏
    cy.get(".bpx-player-ctrl-btn.bpx-player-ctrl-web").should('exist').click()
    cy.wait(1000)

    // 进入浏览器全屏
    cy.get('video')
      .trigger('mouseover') 
      .wait(1000);
    cy.get(".bpx-player-ctrl-btn.bpx-player-ctrl-full").should('exist').click()

    // 快进与后退测试
    cy.wait(1000)
    cy.get('video').trigger('keydown', { key: 'ArrowRight', keyCode: 39 }); // 快进
    cy.wait(1000); 
    cy.get('video').trigger('keydown', { key: 'ArrowLeft', keyCode: 37 }); // 后退
    cy.wait(1000); 

    // 设置播放倍速，先检查倍数设置元素的存在与可见性
    cy.get('video')
      .trigger('mouseover') 
      .wait(1000);
    cy.get('.bpx-player-ctrl-playbackrate-result')
      .should('exist')
      .should('be.visible')
      .click();
    cy.wait(1000);

    // 设置两倍速播放
    cy.get('video')
      .trigger('mouseover')
      .wait(1000);
    cy.get('.bpx-player-ctrl-playbackrate-menu > [data-value="2"]')
      .should('exist')
      .should('be.visible')
      .click();
    cy.wait(2000);

    // 音量调节测试
    cy.get('video').trigger('keydown', { key: 'ArrowUp', keyCode: 38 });
    cy.wait(1000); 
    cy.get('video').trigger('keydown', { key: 'ArrowDown', keyCode: 40 });
    cy.wait(1000); 
  })

  afterEach(() => {
    cy.clearCookies();
    cy.clearLocalStorage();
  });
  
});

